﻿using System.Text;
using Dogshow.BusinessLogic.Managers;
using Dogshow.BusinessLogic.Utils;
using Dogshow.Model;
using Dogshow.Web.Models;
using DogshowRepository;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace Dogshow.BusinessLogicTests.Managers
{
    [TestClass]
    public class KorisniciManagerFixtures
    {
        private KorisniciManager m_KorisniciManager;

        private Mock<IEncryptor> m_Encryptor;

        private Mock<IKorisniciRepository> m_KorisniciRepository;

        private Mock<IKinoloziRepository> m_KinoloziRepository;

        [TestInitialize]
        public void TestInit()
        {
            m_Encryptor = new Mock<IEncryptor>();
            m_KorisniciRepository = new Mock<IKorisniciRepository>();
            m_KinoloziRepository = new Mock<IKinoloziRepository>();
            m_KorisniciManager = new KorisniciManager(m_Encryptor.Object, m_KorisniciRepository.Object, m_KinoloziRepository.Object);
        }

        [TestMethod]
        public void Izmeni_Lozinku_Korisniku()
        {
            // Arrange
            var korisnik = new Korisnik
            {
                VidljivaLozinka = "1302"
            };

            // Act
            m_KorisniciManager.SacuvajPodatkeKorisnika(korisnik);

            // Assert
            m_Encryptor.Verify(x => x.Encrypt(korisnik.VidljivaLozinka));
        }

        [TestMethod]
        public void Sacuvaj_Korisnika_Bez_Promene_Lozinke()
        {
            // Arrange
            var korisnik = new Korisnik
            {
                VidljivaLozinka = "***************",
            };

            // Act
            m_KorisniciManager.SacuvajPodatkeKorisnika(korisnik);

            // Assert
            m_Encryptor.Verify(x => x.Encrypt(korisnik.VidljivaLozinka), Times.Never());
        }

        [TestMethod]
        public void Sacuvaj_Korisnika_Kao_Novog_Kinologa()
        {
            // Arrange
            var korisnik = new Korisnik
            {
                KorisnickoIme = "zeks",
                VidljivaLozinka = "***************",
                Naziv = "Željko Bajšanski",
                VrstaKorisnika = VrsteKorisnika.Korisnik,
                Adresa = "Preradovićeva 36",
                IdMesta = 1,
                Telefon = "063/528065",
                Email = "zeljko.bajsanski@gmail.com"
            };
            m_KinoloziRepository.Setup(x => x.Sacuvaj(It.IsAny<Kinolog>())).Returns(2);

            // Act
            m_KorisniciManager.SacuvajPodatkeKorisnika(korisnik);

            // Assert
            m_KorisniciRepository.Verify(x => x.Sacuvaj(It.Is<Korisnik>(k => k.KorisnickoIme == korisnik.KorisnickoIme 
                    && k.IdKinologa == 2
                    && k.Naziv == korisnik.Naziv
                    && k.VrstaKorisnika == korisnik.VrstaKorisnika
                    && k.Adresa == korisnik.Adresa
                    && k.IdMesta == korisnik.IdMesta
                    && k.Telefon == korisnik.Telefon
                    && k.Email == korisnik.Email
                )));
        }

        [TestMethod]
        public void Izmeni_Podatke_Postojecem_Kinologu()
        {
            // Arrange
            var korisnik = new Korisnik
            {
                KorisnickoIme = "zeks",
                VidljivaLozinka = "***************",
                Naziv = "Željko Bajšanski",
                VrstaKorisnika = VrsteKorisnika.Korisnik,
                Adresa = "Preradovićeva 36",
                IdMesta = 1,
                Telefon = "063/528065",
                Email = "zeljko.bajsanski@gmail.com",
                IdKinologa = 2
            };
            

            // Act
            m_KorisniciManager.SacuvajPodatkeKorisnika(korisnik);

            // Assert
            m_KorisniciRepository.Verify(x => x.Sacuvaj(It.Is<Korisnik>(k => k.KorisnickoIme == korisnik.KorisnickoIme
                    && k.IdKinologa == 2
                    && k.Naziv == korisnik.Naziv
                    && k.VrstaKorisnika == korisnik.VrstaKorisnika
                    && k.Adresa == korisnik.Adresa
                    && k.IdMesta == korisnik.IdMesta
                    && k.Telefon == korisnik.Telefon
                    && k.Email == korisnik.Email
                )));
            m_KinoloziRepository.Verify(x => x.Sacuvaj(It.IsAny<Kinolog>()), Times.Never());
        }
    }

}